package 异常;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
异常：就是程序出现了不正常的情况
                        Throwable
             Error                      Exception
                            RuntimeException        非RuntimeException

Error：严重问题，不需要处理
Exception：称为异常类，他表示程序本身可以处理的问题
RuntimeException：在编译期是不检查的，出现问题后，需要我们回来修改代码
非RuntimeException：编译期就必须处理的，否则程序不能通过编译，就更不能正常运行了

JVM的默认处理方案
    把异常的名称，异常原因及异常出现的位置信息输出在了控制台
    程序停止执行

try...catch....
格式：
    try{
        可能出现异常的代码;
    }catch(异常类名 变量名){
        异常的处理代码;
    }
执行流程：
    程序从try里面的代码开始执行
    出现异常，会自动生成一个异常类对象，该异常对象将被提交给Java运行时系统
    当Java运行时系统接收到异常对象时，回到catch中去找匹配的异常类，找到后进行异常的处理
    执行完毕之后，程序还可以继续往下执行

Throwable成员方法
    public String getMessage()
    public String toString()
    public void printStackTrace()

Java异常分为两大类
编译时异常：必须显示处理，否则程序会发生错误，无法通过编译
           两种处理方案：try...catch..或throws，如果采用throws，将来谁调用谁处理
运行时异常：无需显示处理，也可以和编译时异常一样处理；需要我们回来修改代码
所有RuntimeException类及其子类的实例都被成为运行时异常，其他异常都是编译时异常

异常处理之throws，只是将异常抛出去，正在处理还是要try catch；
快捷键：Alt+Enter
格式： throws 异常类名
这个格式是跟着方法的括号后面的
 */
public class ExceptionDemo {
    public static void main(String[] args) {
        System.out.println("开始");
        //method();
        System.out.println("结束");
        //show1();

        try {
            show2();
        } catch (ParseException e) {
            e.printStackTrace();
        }

    }

    public static void method(){
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);//new ArrayIndexOutOfBoundsException(”xxx“);
        }catch(ArrayIndexOutOfBoundsException e){
//            System.out.println("你访问的数组的索引不存在");
            //e.printStackTrace();

            //public String getMessage()，返回throwable的详细消息字符串
            //System.out.println(e.getMessage());//Index 3 out of bounds for length 3

            //public String toString()，返回throwable的简短描述
            //System.out.println(e.toString());//java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3

            //public void printStackTrace(),把异常的错误信息输出在控制台
            e.printStackTrace();
        }
    }

    //编译时异常
    public static void show2() throws ParseException {
//        try {
//            String s="2048-08-09";
//            SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//            Date d=sdf.parse(s);
//            System.out.println(d);
//        }catch (ParseException pe){
//            pe.getStackTrace();
//        }
        String s="2048-08-09";
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        Date d=sdf.parse(s);
        System.out.println(d);


    }


    //运行时异常
    public static void show1(){
        try {
            int[] arr = {1, 2, 3};
            System.out.println(arr[3]);//ArrayIndexOutOfBoundsException
        }catch (ArrayIndexOutOfBoundsException e) {
            e.printStackTrace();
        }
    }
}

/*
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
	at 异常.ExceptionDemo.method(ExceptionDemo.java:25)
	at 异常.ExceptionDemo.main(ExceptionDemo.java:18)
 */

/*
    public class Throwable{
        private String detailMessage;

    public Throwable(String message) {
        detailMessage = message;
    }

        public String getMessage() {
            return detailMessage;
        }
    }
 */
